<?php

class  Gps{
	var $offset_file = "./resources/misc/gps_offsets.dat";

	function __construct() {
    }
	
	function encode($data){
		$result='';
		for ($i=0; $i<strlen($data); $i=$i+2){
			$tmp=0;
			for ($j=0;$j<2;$j++){
				$f=pow(16,$j);
				switch($data[$i+$j]) {
					case ".": $t=10; break;
					case "-": $t=11; break;
					default:  $t=ord($data[$i+$j])-48; break;
				}
				$tmp += $t*$f;
	  		}
	  		$result.=chr($tmp);
		}
		return $result;
	}

	function decode($data){
		$result='';
		for ($i=0;$i<strlen($data);$i++){
			$t=ord($data[$i]);
			for ($j=1;$j>=0;$j--){
				$tmp = $t%16;
				switch($tmp) {
					case 10: $result.='.'; break;
					case 11: $result.='-'; break;
					default: $result.=chr($tmp+48); break;
				}
				$t=($t-$tmp)/16;
			}
		}
		return $result;
	}
	
	function generate_datafile($ori, $tgt) {
		$datafile=explode("\r\n", file_get_contents($ori));
	
		$f=fopen($tgt,"w");
		fwrite($f, str_repeat(chr(0), (1347-735)*(535-181)*10)); //记录条数*每条记录所需字节数（10）  [1347-735]行，[535-181]列
	
		for ($i=0; $i<count($datafile); $i++){
			$line=explode(",", $datafile[$i]);
			$lng = (int)((float)trim(str_replace('"','',$line[0]))*10);
			$lat = (int)((float)trim(str_replace('"','',$line[1]))*10);
	
			$data_lng = str_pad(trim(str_replace('"','',$line[4])), 10, '0', STR_PAD_RIGHT);
			$data_lat = str_pad(trim(str_replace('"','',$line[5])), 10, '0', STR_PAD_RIGHT);
	
			$offset = ($lng - 736)*3540 + ($lat-182)*10; //记录位移量，行数*每行数据大小 + 在每行中的第几列*每个数据元大小(10)
			fseek($f,$offset);
	
			$data = $this->encode($data_lat).$this->encode($data_lng);
	
			fwrite($f, $data);
	
		}
		fclose($f);		
	}
	
	function get_offsets($lat, $lng, $func=0) {
		if ($lat>53.5 || $lat<18.2 || $lng>134.7 || $lng<73.6) {	//不在中国范围内
			return array($lat, $lng);
		} else {
		
			$f=fopen($this->offset_file,"r");
			
			if ($func==0){			//截尾取整
				$_lat=floor($lat*10);
				$_lng=floor($lng*10);	
			} else {				//或四舍五入
				$_lat=round($lat*10);
				$_lng=round($lng*10);					
			}
			$offset = ($_lng - 736)*3540 + ($_lat-182)*10;	//计算偏移量
			fseek($f,$offset);
			$lat_data=fread($f,5);							//读取数据，5字节
			$lng_data=fread($f,5);
			fclose($f);
	
			$lat_data=$lat + (double) $this->decode($lat_data);
			$lng_data=$lng + (double) $this->decode($lng_data);
	
			return array($lat_data, $lng_data);
		}	
	}
}

?>